package main

import(
	"fmt"
)

func recv(c chan int) {
	res := <-c
	fmt.Println("接收成功", res)
}

func counter(out chan<- int) {
	for i := 0; i < 100; i++ {
		out <- i
	}
	close(out)
}

func squarer(out chan<- int, in <-chan int) {
	for i := range in {
		out <- i * i
	}
	close(out)
}

func printer(in <-chan int) {
    for i := range in {
        fmt.Println(i)
    }
}

func main() {
	// 1. 无缓冲的通道
	// ch := make(chan int)
	// go recv(ch)
	// ch <- 10
	// fmt.Println("发送成功")

	// 2. 有缓冲的通道
	// ch := make(chan int, 1) // 创建一个容量为1的有缓冲区通道
    // ch <- 10
    // fmt.Println("发送成功")

	// 3. 关闭通道
	// c := make(chan int) 
	// go func() {
	// 	for i := 0; i < 5; i++ {
	// 		c <- i
	// 	}
	// 	close(c)
	// }()
	// for {
	// 	if data, ok := <-c; ok {
	// 		fmt.Println(data)
	// 	} else {
	// 		break
	// 	}
	// }
	// fmt.Println("main结束")

	// 4.如何优雅的从通道循环取值
	// ch1 := make(chan int)
	// ch2 := make(chan int)
	// go func() {
	// 	for i := 0; i < 100; i++ {
	// 		ch1 <- i
	// 	} 
	// 	close(ch1)
	// }()
	// go func() {
	// 	for {
	// 		i, ok := <-ch1 // 通道关闭后再取值ok=false
	// 		if !ok {
	// 			break
	// 		} 
	// 		ch2 <- i * i
	// 	}
	// 	close(ch2)
	// }()
	// for i := range ch2 { // 通道关闭后会退出for range循环
	// 	fmt.Println(i)
	// }

	// 5.单向通道
	ch1 := make(chan int)
	ch2 := make(chan int) 
	go counter(ch1)
	go squarer(ch2, ch1)
	printer(ch2)
}
